#Pre-Processing
##Importing and examining the trial-level dataset
##Import
###########
#Imports the data file and saves it into the global environment.
#Gets rid of any extra columns with an X
#Directory and File_Name should be in " "
#directory is "C:/Users/Alexander/Desktop/OrthFacil/RCode/"
Importing_and_examining <- function(directory, File_Name){
setwd(directory) #set working directory to folder with files
experiment <- list.files(pattern="*.txt") #Get name of the experiment data file
filepath <- file.path(directory, experiment) #Get filepath
Compiled <- read.delim(filepath, header =TRUE) #Import file specified by filepath
assign(File_Name, Compiled, envir = .GlobalEnv)
return(str(Compiled[1:10,]))
}
Importing_and_examining("C:/Users/Alexander/Desktop/S64_LongSOASemPri_OrthFacil/SemPri_OrthFacil_RCode", "Compiled")
'data.frame': 10 obs. of 20 variables:
$ Computer : Factor w/ 6 levels "1","2","3","BA",..: 6 6 6 6 6 6 6 6 6 6
$ Group : Factor w/ 4 levels "L1","L2","L3",..: 1 1 1 1 1 1 1 1 1 1
$ Count : int 1 2 3 4 5 6 7 8 9 10
$ Subject : int 1 1 1 1 1 1 1 1 1 1
$ RefreshRate: Factor w/ 3 levels "16.58ms","16.62ms",..: 3 3 3 3 3 3 3 3 3 3
$ Item : int 705 706 707 708 701 712 702 703 704 709
$ RT : num 717 748 -649 611 622 ...
$ Target : Factor w/ 140 levels "ACHE","BEAL",..: 140 38 101 100 27 34 109 120 115 54
$ List : int 0 0 0 0 0 0 0 0 0 0
$ Lexicality : Factor w/ 3 levels "nonword","practice",..: 2 2 2 2 2 2 2 2 2 2
$ OrthPrime : Factor w/ 199 levels "achb","baqt",..: 156 124 16 131 125 171 162 164 146 73
$ Orth_Rel : Factor w/ 3 levels "practice","related",..: 1 1 1 1 1 1 1 1 1 1
$ SemPrime : Factor w/ 203 levels "adorable","all",..: 135 84 61 118 5 86 23 66 76 13
$ Sem_Rel : Factor w/ 4 levels "NONE","practice",..: 2 2 2 2 2 2 2 2 2 2
$ Trial.Type : Factor w/ 3 levels "correct","incorrect",..: 3 3 3 3 3 3 3 3 3 3
$ X : logi NA NA NA NA NA NA ...
$ X.1 : logi NA NA NA NA NA NA ...
$ X.2 : logi NA NA NA NA NA NA ...
$ X.3 : logi NA NA NA NA NA NA ...
$ X.4 : logi NA NA NA NA NA NA ...
##The Histogram for all correct responses:
library(ggplot2)
#Shows a frequency histogram of the response RTs
ggplot(Compiled, aes(x=RT)) + #Change rt to whatever the dependent variable is!
geom_histogram(breaks=seq(0, 2000, by=25))

NA
NA
##Trial Classification
##3. Trial Classification
#########################
#File_Name should be in " "
# 1-error (just incorrect responses)
# 2-correct response within cutoff range
# 3-outlier (correct response just too slow, or no response)
Trial_classification <- function(input_file,File_Name, time_out, lower_RT, upper_RT){
input_file$Trial_Criterion[input_file$RT < 0 & input_file$RT > time_out] <- 1 #error
input_file$Trial_Criterion[input_file$RT > lower_RT & input_file$RT < upper_RT] <- 2 #correct response
input_file$Trial_Criterion[input_file$RT == time_out |
(input_file$RT < lower_RT & input_file$RT > 0)|
input_file$RT > upper_RT] <- 3 #outliers and no response
assign(File_Name, input_file, envir = .GlobalEnv)
return(str(input_file[1:10,]))
}
Trial_classification(Compiled,"Compiled",-2500,250,1750)
'data.frame': 10 obs. of 21 variables:
$ Computer : Factor w/ 6 levels "1","2","3","BA",..: 6 6 6 6 6 6 6 6 6 6
$ Group : Factor w/ 4 levels "L1","L2","L3",..: 1 1 1 1 1 1 1 1 1 1
$ Count : int 1 2 3 4 5 6 7 8 9 10
$ Subject : int 1 1 1 1 1 1 1 1 1 1
$ RefreshRate : Factor w/ 3 levels "16.58ms","16.62ms",..: 3 3 3 3 3 3 3 3 3 3
$ Item : int 705 706 707 708 701 712 702 703 704 709
$ RT : num 717 748 -649 611 622 ...
$ Target : Factor w/ 140 levels "ACHE","BEAL",..: 140 38 101 100 27 34 109 120 115 54
$ List : int 0 0 0 0 0 0 0 0 0 0
$ Lexicality : Factor w/ 3 levels "nonword","practice",..: 2 2 2 2 2 2 2 2 2 2
$ OrthPrime : Factor w/ 199 levels "achb","baqt",..: 156 124 16 131 125 171 162 164 146 73
$ Orth_Rel : Factor w/ 3 levels "practice","related",..: 1 1 1 1 1 1 1 1 1 1
$ SemPrime : Factor w/ 203 levels "adorable","all",..: 135 84 61 118 5 86 23 66 76 13
$ Sem_Rel : Factor w/ 4 levels "NONE","practice",..: 2 2 2 2 2 2 2 2 2 2
$ Trial.Type : Factor w/ 3 levels "correct","incorrect",..: 3 3 3 3 3 3 3 3 3 3
$ X : logi NA NA NA NA NA NA ...
$ X.1 : logi NA NA NA NA NA NA ...
$ X.2 : logi NA NA NA NA NA NA ...
$ X.3 : logi NA NA NA NA NA NA ...
$ X.4 : logi NA NA NA NA NA NA ...
$ Trial_Criterion: num 2 2 1 2 2 2 2 2 2 2
#When the variable information is generated, recode the variable classes as necessary
#Recode the column variable types as necessary
cols <- c("Subject", "Item", "Trial_Criterion", "List")
Compiled[,cols] <- lapply(Compiled[,cols], as.factor)
#Get rid of any empty columns
Compiled <-Compiled[, -grep("^X", colnames(Compiled))]
str(Compiled[1:10,])
'data.frame': 10 obs. of 16 variables:
$ Computer : Factor w/ 6 levels "1","2","3","BA",..: 6 6 6 6 6 6 6 6 6 6
$ Group : Factor w/ 4 levels "L1","L2","L3",..: 1 1 1 1 1 1 1 1 1 1
$ Count : int 1 2 3 4 5 6 7 8 9 10
$ Subject : Factor w/ 85 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1
$ RefreshRate : Factor w/ 3 levels "16.58ms","16.62ms",..: 3 3 3 3 3 3 3 3 3 3
$ Item : Factor w/ 140 levels "1","2","3","4",..: 133 134 135 136 129 140 130 131 132 137
$ RT : num 717 748 -649 611 622 ...
$ Target : Factor w/ 140 levels "ACHE","BEAL",..: 140 38 101 100 27 34 109 120 115 54
$ List : Factor w/ 5 levels "0","1","2","3",..: 1 1 1 1 1 1 1 1 1 1
$ Lexicality : Factor w/ 3 levels "nonword","practice",..: 2 2 2 2 2 2 2 2 2 2
$ OrthPrime : Factor w/ 199 levels "achb","baqt",..: 156 124 16 131 125 171 162 164 146 73
$ Orth_Rel : Factor w/ 3 levels "practice","related",..: 1 1 1 1 1 1 1 1 1 1
$ SemPrime : Factor w/ 203 levels "adorable","all",..: 135 84 61 118 5 86 23 66 76 13
$ Sem_Rel : Factor w/ 4 levels "NONE","practice",..: 2 2 2 2 2 2 2 2 2 2
$ Trial.Type : Factor w/ 3 levels "correct","incorrect",..: 3 3 3 3 3 3 3 3 3 3
$ Trial_Criterion: Factor w/ 3 levels "1","2","3": 2 2 1 2 2 2 2 2 2 2
#Pivot Table with summary of subject errors
library(rpivotTable)
subject_errors<- rpivotTable(data = Compiled,
rows = c("Group","Subject"), #list was counterbalance
cols = c("Lexicality","Trial_Criterion"),
vals = "Trial_Criterion",
aggregatorName = "Count",
rendererName = "Error Rates",
width="100%",
height="100px"
)
print(subject_errors)
NULL
#Pivot Table with summary of item errors
library(rpivotTable)
item_errors<- rpivotTable(data = Compiled,
rows = c("Lexicality","Target"), #list was counterbalance
cols = c("Trial_Criterion"),
vals = "Trial_Criterion",
aggregatorName = "Count",
rendererName = "Error Rates",
width="100%",
height="100px"
)
print(item_errors)
NULL
##Error Rates Prior to Subject and Trial Removal
##Removing Subjects, Items and Trials
##Removing Subjects and Trials
#################################
#Removes a list of specified subjects
#File_Name should be in " "
Trial_Cleaning <- function(input_file,Clean_File,Error_File,PreAnalysis_File,...){
removed_SubjectsORItems <- list(...) #list of subjects to remove
tmp1 <- input_file[ ! input_file$Subject %in% removed_SubjectsORItems, ] #removing the subjects
tmp2 <- tmp1[ ! tmp1$Target %in% removed_SubjectsORItems,] #Revmoing the items
practice_trials <- which(with(tmp2, Lexicality == "practice")) #Defining Practice Trials
tmp3 <- tmp2[-practice_trials,] #removing the practice trials
assign(PreAnalysis_File, tmp3, envir = .GlobalEnv) #File with bad subjects and items removed but with outliers and errors present. This is for counting the number of error and outlier trials
outlier_trials <- which(with(tmp3, Trial_Criterion == 3)) #Defining Outlier Trials
tmp4 <- tmp3[-outlier_trials,] #Revmoing the outlier trials
assign(Error_File, tmp4, envir = .GlobalEnv) #Error file has incorrect and correct responses
error_trials <- which(with(tmp4, Trial_Criterion == 1)) #list of rows to remove
tmp5 <- tmp4[-error_trials,] #Removing Error Trials
assign(Clean_File, tmp5, envir = .GlobalEnv)
subject_prelim <- aggregate(RT ~ Group + Subject, data=tmp5, mean, na.rm=TRUE)
return(subject_prelim)
}
Trial_Cleaning(Compiled,"Clean","Errors","PreAnalysis", 2,7,9,101,12,1038,21,22,1007,1011,1004,1008,1016)
#Results Summary
##Creating Variables of Interest to summarize
##############
#SUMMARY_STATS
##############
#Basic Ex-Gaussian Functions
mux <- function(x, n = length(x)) { # This gives me only the mu
k <- start <- c(mu = NaN, sigma = NaN, tau = NaN)
k[1] <- mean(x)
xdev <- x - k[1]
k[2] <- sum(xdev^2)/(n-1)
k[3] <- sum(xdev^3)/(n-1)
if (k[3] > 0)
start[3] <- (k[3]/2)^(1/3)
else start[3] <- 0.8*sd(x)
start[2] <- sqrt(abs(k[2] - start[3]^2))
start[1] <- k[1] - start[3]
return(start[1])
}
sigx <- function(x, n = length(x)) { # THIS GIVES ME ONLY THE SIGMA
k <- start <- c(mu = NaN, sigma = NaN, tau = NaN)
k[1] <- mean(x)
xdev <- x - k[1]
k[2] <- sum(xdev^2)/(n-1)
k[3] <- sum(xdev^3)/(n-1)
if (k[3] > 0)
start[3] <- (k[3]/2)^(1/3)
else start[3] <- 0.8*sd(x)
start[2] <- sqrt(abs(k[2] - start[3]^2))
start[1] <- k[1] - start[3]
return(start[2])
}
taux <- function(x, n = length(x)) { # THIS GIVES ME ONLY THE TAU
k <- start <- c(mu = NaN, sigma = NaN, tau = NaN)
k[1] <- mean(x)
xdev <- x - k[1]
k[2] <- sum(xdev^2)/(n-1)
k[3] <- sum(xdev^3)/(n-1)
if (k[3] > 0)
start[3] <- (k[3]/2)^(1/3)
else start[3] <- 0.8*sd(x)
start[2] <- sqrt(abs(k[2] - start[3]^2))
start[1] <- k[1] - start[3]
return(start[3])
}
#Other Functions
SE <- function(x){se = sd(x)/sqrt(length(x))}
ErrorRate <- function(x){
ER = length(which(x == 1))/length(which(x == 1| x ==2))
}
##Creating Data Frame Summaries Subject and item summaries for words and errors
#library(data.table)
#Summary Definition Protocols
Subject_RT <- list(Clean$Subject, Clean$Group, Clean$Sem_Rel, Clean$Orth_Rel, Clean$Lexicality)
Subject_Errors <- list (Errors$Subject, Errors$Group, Errors$Sem_Rel, Errors$Orth_Rel, Errors$Lexicality)
Item_RT <- list(Clean$Target, Clean$List, Clean$Sem_Rel, Clean$Orth_Rel, Clean$Lexicality)
Item_Errors <- list(Errors$Target, Errors$List, Errors$Sem_Rel, Errors$Orth_Rel, Errors$Lexicality)
##Subject means
Subject <- aggregate(RT ~ Subject + Group + Sem_Rel + Orth_Rel + Lexicality, data = Clean, FUN = mean, na.rm = TRUE) #RT Means
Subject$SE <- na.omit(sapply(split(Clean$RT, Subject_RT), SE)) #SE
Subject$Mu <- na.omit(sapply(split(Clean$RT, Subject_RT), mux)) #Mu
Subject$Sigma <- na.omit(sapply(split(Clean$RT, Subject_RT), sigx)) #Sigma
Subject$Tau <- na.omit(sapply(split(Clean$RT, Subject_RT), taux)) #Tau
Subject$ErrorRate <- na.omit(sapply(split(Errors$Trial_Criterion, Subject_Errors), ErrorRate)) #Error Rate
##Item means
Item <- aggregate(RT ~ Target + List + Sem_Rel + Orth_Rel + Lexicality, data = Clean, FUN = mean, na.rm = TRUE) #RT Means
Item$SE <- na.omit(sapply(split(Clean$RT, Item_RT), SE)) #SE
Item$Mu <- na.omit(sapply(split(Clean$RT, Item_RT), mux)) #Mu
Item$Sigma <- na.omit(sapply(split(Clean$RT, Item_RT), sigx)) #Sigma
Item$Tau <- na.omit(sapply(split(Clean$RT, Item_RT), taux)) #Tau
Item$ErrorRate <- na.omit(sapply(split(Errors$Trial_Criterion, Item_Errors), ErrorRate)) #Error Rate
#Condition-level means
Conditions <- aggregate(cbind(RT, SE, Mu, Sigma, Tau, ErrorRate) ~ Sem_Rel + Orth_Rel + Lexicality, data = Subject, FUN = mean)
print(Conditions)
##Splitting Latency and Error files into Words and Non-words
##Splitting File
###################
#Always split words/nonwords firts!!!
#File_Name1/2, subset1/2, and criterion_variable should be in " "
File_Split <- function(input_file, criterion_variable, File_Name1,subset1, File_Name2,subset2){
tmp1 <- input_file[input_file[criterion_variable]==subset1,]
assign(File_Name1, tmp1, envir = .GlobalEnv)
tmp2 <- input_file[input_file[criterion_variable]==subset2,]
assign(File_Name2, tmp2, envir = .GlobalEnv)
}
##Subject and Item Latency and Error Analyses
#Data Frames for Subject Latency and Error Summaries
File_Split(Subject, "Lexicality", "Word_Subject", "word", "Nonword_Subject", "nonword")
#Data frames for Item Latency and Error Summaries
File_Split(Item, "Lexicality", "Word_Item", "word", "Nonword_Item", "nonword")
##Trial Level Data for GLMER analyses and Quartile Analyses
#Clean Datafrmaes
File_Split(Clean, "Lexicality", "WordRT_Trial", "word", "NonwordRT_Trial", "nonword")
#Error Dataframes
File_Split(Errors, "Lexicality", "WordErrors_Trial", "word", "NonwordErrors_Trial", "nonword")
#======== #Analyses #========
##ANOVAs
###Latencies
library(afex)
library(apa)
library(emmeans)
#Word Subject-Level ANOVA
FsW <-aov_ez("Subject", #Subject variable
"RT", #dependent variable
Word_Subject, #dataset
between = c("Group"),
within = c("Sem_Rel","Orth_Rel"),
#afex_options(correction_aov = "none"), #Correction of d.f.!!!
type = 3,
factorize = TRUE)
FsW_omnibus <- anova(FsW)
print("Word Subject-Level ANOVA")
print(FsW_omnibus)
anova_apa(FsW)
mFsW <- emmeans(FsW,~Sem_Rel|Orth_Rel)
mFsW
pairs(mFsW)
#Word Item-Level ANOVA
FiW <-aov_ez("Target", #Subject variable
"RT", #dependent variable
Word_Item, #dataset
between = c("List"),
within = c("Sem_Rel","Orth_Rel"),
#afex_options(correction_aov = "none"), #Correction of d.f.!!!
type = 3,
factorize = TRUE)
FiW_omnibus <- anova(FiW)
print("Word Item-Level ANOVA")
print(FiW_omnibus)
anova_apa(FiW)
#Nonword Subject-Level ANOVA
FsNw <-aov_ez("Subject", #Subject variable
"RT", #dependent variable
Nonword_Subject, #dataset
between = c("Group"),
within = c("Orth_Rel"),
#afex_options(correction_aov = "none"), #Correction of d.f.!!!
type = 3,
factorize = TRUE)
FsNw_omnibus <- anova(FsNw)
print("Nonword Subject-Level ANOVA")
print(FsNw_omnibus)
anova_apa(FsNw)
#Nonword Item-Level ANOVA
FiNw <-aov_ez("Target", #Subject variable
"RT", #dependent variable
Nonword_Item, #dataset
between = c("List"),
within = c("Orth_Rel"),
#afex_options(correction_aov = "none"), #Correction of d.f.!!!
type = 3,
factorize = TRUE)
FiNw_omnibus <- anova(FiNw)
print("Nonword Subject-Level ANOVA")
print(FiNw_omnibus)
anova_apa(FiNw)
###Errors
library(afex)
library(apa)
library(emmeans)
#Word Subject-Level ANOVA
FsW <-aov_ez("Subject", #Subject variable
"ErrorRate", #dependent variable
Word_Subject, #dataset
between = c("Group"),
within = c("Sem_Rel","Orth_Rel"),
#afex_options(correction_aov = "none"), #Correction of d.f.!!!
type = 3,
factorize = TRUE)
FsW_omnibus <- anova(FsW)
print("Word Subject-Level ANOVA")
print(FsW_omnibus)
anova_apa(FsW)
mFsW <- emmeans(FsW,~Orth_Rel|Sem_Rel)
mFsW
pairs(mFsW)
#Word Item-Level ANOVA
FiW <-aov_ez("Target", #Subject variable
"ErrorRate", #dependent variable
Word_Item, #dataset
between = c("List"),
within = c("Sem_Rel","Orth_Rel"),
#afex_options(correction_aov = "none"), #Correction of d.f.!!!
type = 3,
factorize = TRUE)
FiW_omnibus <- anova(FiW)
print("Word Item-Level ANOVA")
print(FiW_omnibus)
anova_apa(FiW)
#Nonword Subject-Level ANOVA
FsNw <-aov_ez("Subject", #Subject variable
"ErrorRate", #dependent variable
Nonword_Subject, #dataset
between = c("Group"),
within = c("Orth_Rel"),
#afex_options(correction_aov = "none"), #Correction of d.f.!!!
type = 3,
factorize = TRUE)
FsNw_omnibus <- anova(FsNw)
print("Nonword Subject-Level ANOVA")
print(FsNw_omnibus)
anova_apa(FsNw)
#Nonword Item-Level ANOVA
FiNw <-aov_ez("Target", #Subject variable
"ErrorRate", #dependent variable
Nonword_Item, #dataset
between = c("List"),
within = c("Orth_Rel"),
#afex_options(correction_aov = "none"), #Correction of d.f.!!!
type = 3,
factorize = TRUE)
FiNw_omnibus <- anova(FiNw)
print("Nonword Subject-Level ANOVA")
print(FiNw_omnibus)
anova_apa(FiNw)
##GLME
###Latencies
#TROUBLESHOOTING: check out this page: http://rpubs.com/bbolker/lme4trouble1
library(lme4)
library(car)
options(contrasts = c("contr.sum","contr.poly"))
#Inverse Gaussian Distribution
wordRT_invgauss <- glmer(RT ~ Orth_Rel +
(1|Target) + (1|Subject),
data = WordRT_Trial,
family = inverse.gaussian(link="identity"))
summary(wordRT_invgauss)
#Anova(wordRT_invgauss)
#restart from previous fit
#ss <- getME(wordRT_invgauss,c("theta","fixef"))
#wordRT_invgauss2 <- update(wordRT_invgauss,start=ss,control=glmerControl(optCtrl=list(maxfun=1e9)))
#summary(wordRT_invgauss2)
###Errors
library(lme4)
options(contrasts = c("contr.sum","contr.poly"))
#Obtaining the maximal model (This is the most complex model which could still converge)
wordError_Binomial <- glmer(Trial_Criterion ~ Orth_Rel + #Fixed effects and their interactions
(1|Subject) + (1|Target), #Random effects with random intercepts
data = WordErrors_Trial,
family = "binomial",
nAGO = 1
)
summary(wordError_Binomial)
#================= #Quantile Analyses #=================
##Setting up Quartile Analyses
Quantile_Assign <- function(input_file, File_Name, Var, QuantileLabel, QuantileSize, MaxRank){
input_file$rank <- ave(input_file$RT, input_file$Subject, input_file[,Var], FUN = rank)
input_file$rank <- as.integer(input_file$rank)
i <- 1
while(i*QuantileSize < MaxRank){
input_file$tmp[input_file$rank >=(i-1)*QuantileSize + 1 & input_file$rank <= QuantileSize*i] <- i
i <- i + 1
}
input_file[ ,QuantileLabel] <- input_file$tmp
input_file <- input_file[ , !names(input_file) %in% c("tmp","rank")]
assign(File_Name, input_file, envir = .GlobalEnv)
}
WordErrors_TrialQ <- WordErrors_Trial
WordRT_TrialQ<- WordRT_Trial
Quantile_Assign(WordRT_TrialQ,"WordRT_TrialQ", "Orth_Rel", "OrthRelQ", 7, 36)
Quantile_Assign(WordErrors_TrialQ,"WordErrors_TrialQ", "Orth_Rel", "OrthRelQ", 7, 36)
Quantile_Assign(WordRT_TrialQ,"WordRT_TrialQ", "Sem_Rel", "SemRelQ", 7, 36)
Quantile_Assign(WordErrors_TrialQ,"WordErrors_TrialQ", "Sem_Rel", "SemRelQ", 7, 36)
WordRT_Trial_OrthRelQ <- subset(WordRT_TrialQ, OrthRelQ >=1 & OrthRelQ <=4)
WordRT_Trial_SemRelQ <- subset(WordRT_TrialQ, SemRelQ >=1 & SemRelQ <=4)
##ANOVAs
###Latencies
library(afex)
library(emmeans)
library(apa)
##OrthRelQ Latencies
####################
#Subject Analysis
FsOrthQ <-aov_ez("Subject", #Subject variable
"RT", #dependent variable
WordRT_Trial_OrthRelQ, #dataset
within = c("Orth_Rel","OrthRelQ"),
between = c("Group"),
correction = "none", #Correction of d.f.!!!
type = 3,
factorize = TRUE)
print("Subject-Level ANOVA")
print(anova(FsOrthQ))
anova_apa(FsOrthQ)
MsOrthQ <- emmeans(FsOrthQ, ~ Orth_Rel|OrthRelQ)
#Item Analysis
FiOrthQ <-aov_ez("Target", #Subject variable
"RT", #dependent variable
WordRT_Trial_OrthRelQ, #dataset
within = c("Orth_Rel","OrthRelQ"),
between = c("List"),
correction = "none", #Correction of d.f.!!!
type = 3,
factorize = TRUE)
print("Item-Level ANOVA")
print(anova(FiOrthQ))
anova_apa(FiOrthQ)
MsOrthQ <- emmeans(FiOrthQ, ~ Orth_Rel|OrthRelQ)
##SemRelQ Latencies
####################
#Subject Analysis
FsSemQ <-aov_ez("Subject", #Subject variable
"RT", #dependent variable
WordRT_Trial_SemRelQ, #dataset
within = c("Sem_Rel","SemRelQ"),
between = c("Group"),
correction = "none", #Correction of d.f.!!!
type = 3,
factorize = TRUE)
print("Subject-Level ANOVA")
print(anova(FsSemQ))
anova_apa(FsSemQ)
MsOrthQ <- emmeans(FsSemQ, ~ Sem_Rel|SemRelQ)
#Item Analysis
FiSemQ <-aov_ez("Target", #Subject variable
"RT", #dependent variable
WordRT_Trial_SemRelQ, #dataset
within = c("Sem_Rel","SemRelQ"),
between = c("List"),
correction = "none", #Correction of d.f.!!!
type = 3,
factorize = TRUE)
print("Item-Level ANOVA")
print(anova(FiSemQ))
anova_apa(FiSemQ)
MsOrthQ <- emmeans(FiSemQ, ~ Sem_Rel|SemRelQ)
library(ggplot2)
library(ggrepel)
library(gridExtra)
OrthRelPlot <- emmip(FsOrthQ, Orth_Rel ~ OrthRelQ, CIs = TRUE, engine = "ggplot", plotit = FALSE)
OrthRelPlot$tvar <- as.factor(OrthRelPlot$tvar)
levels(OrthRelPlot$tvar) <- c(levels(OrthRelPlot$tvar), "Neighbor")
levels(OrthRelPlot$tvar) <- c(levels(OrthRelPlot$tvar), "Non-neighbor")
OrthRelPlot[OrthRelPlot == "related"] <- "Neighbor"
OrthRelPlot[OrthRelPlot == "unrelated"] <- "Non-neighbor"
print(OrthRelPlot)
SemRelPlot <- emmip(FsSemQ, Sem_Rel ~ SemRelQ, CIs = TRUE, engine = "ggplot", plotit = FALSE)
SemRelPlot$tvar <- as.factor(SemRelPlot$tvar)
levels(SemRelPlot$tvar) <- c(levels(SemRelPlot$tvar), "Related")
levels(SemRelPlot$tvar) <- c(levels(SemRelPlot$tvar), "Unrelated")
SemRelPlot[SemRelPlot == "related"] <- "Related"
SemRelPlot[SemRelPlot == "unrelated"] <- "Unrelated"
print(SemRelPlot)
Theme_Add <- theme_bw(base_size = 12, base_family = "") +
theme(plot.title = element_text(color = "black",size=12)) +
theme(panel.border = element_blank(), panel.grid.major = element_blank(),panel.grid.minor = element_blank()) +
theme(axis.line = element_line(colour = "black", linetype = "solid")) +
theme(legend.justification=c(1,0),legend.position=c(1,0.05),
legend.title=element_blank(),
legend.text=element_text(colour="black", size=12),
legend.key = element_rect((fill = NA))) +
theme(axis.text.x = element_text(color = "black",size=12),
axis.text.y = element_text(color = "black",size=12))
QuartileLabels <- c("1", "2", "3", "4" )
OrthRelQ_Plot <- ggplot(data = OrthRelPlot, aes(x = xvar, y=yvar, group = tvar))+
geom_line(aes(linetype=tvar), size=1) +
geom_point() +
geom_errorbar(aes(ymin=LCL, ymax=UCL), width=.1) +
geom_text_repel(aes(label=format(OrthRelPlot$yvar, digits=3)),
size = 4,direction = "y", hjust = 2, segment.colour = NA) +
labs(title = "Orthographic Priming Effect", x = "Quantile", y = "RT (ms)") +
scale_x_discrete(limits = c("X1", "X2", "X3", "X4"),labels= QuartileLabels) +
Theme_Add
print(OrthRelQ_Plot)
SemRelQ_Plot <- ggplot(data = SemRelPlot, aes(x = xvar, y=yvar, group = tvar))+
geom_line(aes(linetype=tvar), size=1) +
geom_point() +
geom_errorbar(aes(ymin=LCL, ymax=UCL), width=.1) +
geom_text_repel(aes(label=format(SemRelPlot$yvar, digits=3)),
size = 4, direction = "y", hjust = 2, segment.colour = NA) +
labs(title = "Semantic Priming Effect", x = "Quantile", y = "RT (ms)") +
scale_x_discrete(limits = c("X1", "X2", "X3", "X4"),labels= QuartileLabels) +
Theme_Add
print(SemRelQ_Plot)
ggsave("C:/Users/Alexander/Desktop/MyPlots/Exp1LongSOA_OrthRel.png", plot = OrthRelQ_Plot,scale = 1, width = 16, height = 9, units = c("cm"), dpi = 300, limitsize = TRUE)
ggsave("C:/Users/Alexander/Desktop/MyPlots/Exp1LongSOA_SemRel.png", plot = SemRelQ_Plot,scale = 1, width = 16, height = 9, units = c("cm"), dpi = 300, limitsize = TRUE)
#pdf("C:/Users/Alexander/Desktop/MyPlots/S64_LongSOA_OrthFacil.pdf", width = 12, height = 8)
#S64_LongSOA_OrthFacil <- grid.arrange(SemRelQ_Plot,OrthRelQ_Plot, ncol=2, nrow=1)
#dev.off() # Close the file
LS0tDQp0aXRsZTogIlM2NCBMb25nIFNPQSBTZW0gUHJpIE9ydGhvZ3JhcGhpYyBGYWNpbGl0YXRpb24iDQpvdXRwdXQ6DQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCg0KI1ByZS1Qcm9jZXNzaW5nDQoNCiMjSW1wb3J0aW5nIGFuZCBleGFtaW5pbmcgdGhlIHRyaWFsLWxldmVsIGRhdGFzZXQNCmBgYHtyIEltcG9ydGluZ19hbmRfZXhhbWluaW5nfQ0KIyNJbXBvcnQNCiMjIyMjIyMjIyMjDQojSW1wb3J0cyB0aGUgZGF0YSBmaWxlIGFuZCBzYXZlcyBpdCBpbnRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQuDQojR2V0cyByaWQgb2YgYW55IGV4dHJhIGNvbHVtbnMgd2l0aCBhbiBYDQojRGlyZWN0b3J5IGFuZCBGaWxlX05hbWUgc2hvdWxkIGJlIGluICIgIiANCg0KI2RpcmVjdG9yeSBpcyAiQzovVXNlcnMvQWxleGFuZGVyL0Rlc2t0b3AvT3J0aEZhY2lsL1JDb2RlLyINCkltcG9ydGluZ19hbmRfZXhhbWluaW5nIDwtIGZ1bmN0aW9uKGRpcmVjdG9yeSwgRmlsZV9OYW1lKXsNCiAgc2V0d2QoZGlyZWN0b3J5KSAjc2V0IHdvcmtpbmcgZGlyZWN0b3J5IHRvIGZvbGRlciB3aXRoIGZpbGVzDQogIGV4cGVyaW1lbnQgPC0gbGlzdC5maWxlcyhwYXR0ZXJuPSIqLnR4dCIpICNHZXQgbmFtZSBvZiB0aGUgZXhwZXJpbWVudCBkYXRhIGZpbGUNCiAgZmlsZXBhdGggPC0gZmlsZS5wYXRoKGRpcmVjdG9yeSwgZXhwZXJpbWVudCkgI0dldCBmaWxlcGF0aA0KICBDb21waWxlZCA8LSByZWFkLmRlbGltKGZpbGVwYXRoLCBoZWFkZXIgPVRSVUUpICNJbXBvcnQgZmlsZSBzcGVjaWZpZWQgYnkgZmlsZXBhdGgNCiAgYXNzaWduKEZpbGVfTmFtZSwgQ29tcGlsZWQsIGVudmlyID0gLkdsb2JhbEVudikNCiAgcmV0dXJuKHN0cihDb21waWxlZFsxOjEwLF0pKQ0KfQ0KDQpJbXBvcnRpbmdfYW5kX2V4YW1pbmluZygiQzovVXNlcnMvQWxleGFuZGVyL0Rlc2t0b3AvUzY0X0xvbmdTT0FTZW1QcmlfT3J0aEZhY2lsL1NlbVByaV9PcnRoRmFjaWxfUkNvZGUiLCAiQ29tcGlsZWQiKQ0KDQpgYGANCg0KDQojI1RoZSBIaXN0b2dyYW0gZm9yIGFsbCBjb3JyZWN0IHJlc3BvbnNlczoNCmBgYHtyIFJUX2Rpc3RyaWJ1dGlvbn0NCmxpYnJhcnkoZ2dwbG90MikNCiNTaG93cyBhIGZyZXF1ZW5jeSBoaXN0b2dyYW0gb2YgdGhlIHJlc3BvbnNlIFJUcw0KZ2dwbG90KENvbXBpbGVkLCBhZXMoeD1SVCkpICsgI0NoYW5nZSBydCB0byB3aGF0ZXZlciB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGlzIQ0KICAgICAgICAgICBnZW9tX2hpc3RvZ3JhbShicmVha3M9c2VxKDAsIDIwMDAsIGJ5PTI1KSkNCg0KDQpgYGANCg0KIyNUcmlhbCBDbGFzc2lmaWNhdGlvbg0KYGBge3IgVHJpYWxfQ2xhc3NpZmljYXRpb259DQojIzMuIFRyaWFsIENsYXNzaWZpY2F0aW9uDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojRmlsZV9OYW1lIHNob3VsZCBiZSBpbiAiICINCiMgMS1lcnJvciAoanVzdCBpbmNvcnJlY3QgcmVzcG9uc2VzKQ0KIyAyLWNvcnJlY3QgcmVzcG9uc2Ugd2l0aGluIGN1dG9mZiByYW5nZQ0KIyAzLW91dGxpZXIgKGNvcnJlY3QgcmVzcG9uc2UganVzdCB0b28gc2xvdywgb3Igbm8gcmVzcG9uc2UpIA0KVHJpYWxfY2xhc3NpZmljYXRpb24gPC0gZnVuY3Rpb24oaW5wdXRfZmlsZSxGaWxlX05hbWUsIHRpbWVfb3V0LCBsb3dlcl9SVCwgdXBwZXJfUlQpew0KICBpbnB1dF9maWxlJFRyaWFsX0NyaXRlcmlvbltpbnB1dF9maWxlJFJUIDwgMCAmIGlucHV0X2ZpbGUkUlQgPiB0aW1lX291dF0gPC0gMSAjZXJyb3INCiAgaW5wdXRfZmlsZSRUcmlhbF9Dcml0ZXJpb25baW5wdXRfZmlsZSRSVCA+IGxvd2VyX1JUICYgaW5wdXRfZmlsZSRSVCA8IHVwcGVyX1JUXSA8LSAyICNjb3JyZWN0IHJlc3BvbnNlDQogIGlucHV0X2ZpbGUkVHJpYWxfQ3JpdGVyaW9uW2lucHV0X2ZpbGUkUlQgPT0gdGltZV9vdXQgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRfZmlsZSRSVCA8IGxvd2VyX1JUICYgaW5wdXRfZmlsZSRSVCA+IDApfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2ZpbGUkUlQgPiB1cHBlcl9SVF0gPC0gMyAjb3V0bGllcnMgYW5kIG5vIHJlc3BvbnNlDQogIGFzc2lnbihGaWxlX05hbWUsIGlucHV0X2ZpbGUsIGVudmlyID0gLkdsb2JhbEVudikNCiAgcmV0dXJuKHN0cihpbnB1dF9maWxlWzE6MTAsXSkpDQp9DQpUcmlhbF9jbGFzc2lmaWNhdGlvbihDb21waWxlZCwiQ29tcGlsZWQiLC0yNTAwLDI1MCwxNzUwKQ0KI1doZW4gdGhlIHZhcmlhYmxlIGluZm9ybWF0aW9uIGlzIGdlbmVyYXRlZCwgcmVjb2RlIHRoZSB2YXJpYWJsZSBjbGFzc2VzIGFzIG5lY2Vzc2FyeQ0KDQpgYGANCg0KYGBge3IgQ29ycmVjdGluZyBDb2x1bW5zfQ0KI1JlY29kZSB0aGUgY29sdW1uIHZhcmlhYmxlIHR5cGVzIGFzIG5lY2Vzc2FyeQ0KY29scyA8LSBjKCJTdWJqZWN0IiwgIkl0ZW0iLCAiVHJpYWxfQ3JpdGVyaW9uIiwgIkxpc3QiKQ0KQ29tcGlsZWRbLGNvbHNdIDwtIGxhcHBseShDb21waWxlZFssY29sc10sIGFzLmZhY3RvcikNCg0KI0dldCByaWQgb2YgYW55IGVtcHR5IGNvbHVtbnMNCkNvbXBpbGVkIDwtQ29tcGlsZWRbLCAtZ3JlcCgiXlgiLCBjb2xuYW1lcyhDb21waWxlZCkpXSANCnN0cihDb21waWxlZFsxOjEwLF0pDQpgYGANCg0KI1Bpdm90IFRhYmxlIHdpdGggc3VtbWFyeSBvZiBzdWJqZWN0IGVycm9ycw0KYGBge3IgUGl2b3QgVGFibGUgU3VtbWFyeSBvZiBTdWJqZWN0IEVycm9yc30NCmxpYnJhcnkocnBpdm90VGFibGUpDQpzdWJqZWN0X2Vycm9yczwtIHJwaXZvdFRhYmxlKGRhdGEgPSBDb21waWxlZCwNCiAgICAgICAgICAgICAgICAgICAgICByb3dzID0gYygiR3JvdXAiLCJTdWJqZWN0IiksICNsaXN0IHdhcyBjb3VudGVyYmFsYW5jZQ0KICAgICAgICAgICAgICAgICAgICAgIGNvbHMgPSBjKCJMZXhpY2FsaXR5IiwiVHJpYWxfQ3JpdGVyaW9uIiksICANCiAgICAgICAgICAgICAgICAgICAgICB2YWxzID0gIlRyaWFsX0NyaXRlcmlvbiIsDQogICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRvck5hbWUgPSAiQ291bnQiLA0KICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVyTmFtZSA9ICJFcnJvciBSYXRlcyIsDQogICAgICAgICAgICAgICAgICAgICAgd2lkdGg9IjEwMCUiLCANCiAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9IjEwMHB4Ig0KICApDQpwcmludChzdWJqZWN0X2Vycm9ycykNCmBgYA0KDQojUGl2b3QgVGFibGUgd2l0aCBzdW1tYXJ5IG9mIGl0ZW0gZXJyb3JzDQpgYGB7ciBQaXZvdCBUYWJsZSBTdW1tYXJ5IG9mIEl0ZW0gRXJyb3JzfQ0KbGlicmFyeShycGl2b3RUYWJsZSkNCml0ZW1fZXJyb3JzPC0gcnBpdm90VGFibGUoZGF0YSA9IENvbXBpbGVkLA0KICAgICAgICAgICAgICAgICAgICAgIHJvd3MgPSBjKCJMZXhpY2FsaXR5IiwiVGFyZ2V0IiksICNsaXN0IHdhcyBjb3VudGVyYmFsYW5jZQ0KICAgICAgICAgICAgICAgICAgICAgIGNvbHMgPSBjKCJUcmlhbF9Dcml0ZXJpb24iKSwgIA0KICAgICAgICAgICAgICAgICAgICAgIHZhbHMgPSAiVHJpYWxfQ3JpdGVyaW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdG9yTmFtZSA9ICJDb3VudCIsDQogICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXJOYW1lID0gIkVycm9yIFJhdGVzIiwNCiAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0iMTAwJSIsIA0KICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD0iMTAwcHgiDQogICkNCnByaW50KGl0ZW1fZXJyb3JzKQ0KDQojI0Vycm9yIFJhdGVzIFByaW9yIHRvIFN1YmplY3QgYW5kIFRyaWFsIFJlbW92YWwNCmBgYA0KDQoNCiMjUmVtb3ZpbmcgU3ViamVjdHMsIEl0ZW1zIGFuZCBUcmlhbHMNCmBgYHtyIFRyaWFsX0NsZWFuaW5nfQ0KIyNSZW1vdmluZyBTdWJqZWN0cyBhbmQgVHJpYWxzDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiNSZW1vdmVzIGEgbGlzdCBvZiBzcGVjaWZpZWQgc3ViamVjdHMgDQojRmlsZV9OYW1lIHNob3VsZCBiZSBpbiAiICINClRyaWFsX0NsZWFuaW5nIDwtIGZ1bmN0aW9uKGlucHV0X2ZpbGUsQ2xlYW5fRmlsZSxFcnJvcl9GaWxlLFByZUFuYWx5c2lzX0ZpbGUsLi4uKXsNCiAgcmVtb3ZlZF9TdWJqZWN0c09SSXRlbXMgPC0gbGlzdCguLi4pICNsaXN0IG9mIHN1YmplY3RzIHRvIHJlbW92ZQ0KICB0bXAxIDwtIGlucHV0X2ZpbGVbICEgaW5wdXRfZmlsZSRTdWJqZWN0ICVpbiUgcmVtb3ZlZF9TdWJqZWN0c09SSXRlbXMsIF0gI3JlbW92aW5nIHRoZSBzdWJqZWN0cw0KICB0bXAyIDwtIHRtcDFbICEgdG1wMSRUYXJnZXQgJWluJSByZW1vdmVkX1N1YmplY3RzT1JJdGVtcyxdICNSZXZtb2luZyB0aGUgaXRlbXMNCiAgcHJhY3RpY2VfdHJpYWxzIDwtIHdoaWNoKHdpdGgodG1wMiwgTGV4aWNhbGl0eSA9PSAicHJhY3RpY2UiKSkgI0RlZmluaW5nIFByYWN0aWNlIFRyaWFscw0KICB0bXAzIDwtIHRtcDJbLXByYWN0aWNlX3RyaWFscyxdICNyZW1vdmluZyB0aGUgcHJhY3RpY2UgdHJpYWxzDQogIGFzc2lnbihQcmVBbmFseXNpc19GaWxlLCB0bXAzLCBlbnZpciA9IC5HbG9iYWxFbnYpICNGaWxlIHdpdGggYmFkIHN1YmplY3RzIGFuZCBpdGVtcyByZW1vdmVkIGJ1dCB3aXRoIG91dGxpZXJzIGFuZCBlcnJvcnMgcHJlc2VudC4gVGhpcyBpcyBmb3IgY291bnRpbmcgdGhlIG51bWJlciBvZiBlcnJvciBhbmQgb3V0bGllciB0cmlhbHMNCiAgb3V0bGllcl90cmlhbHMgPC0gd2hpY2god2l0aCh0bXAzLCBUcmlhbF9Dcml0ZXJpb24gPT0gMykpICNEZWZpbmluZyBPdXRsaWVyIFRyaWFscw0KICB0bXA0IDwtIHRtcDNbLW91dGxpZXJfdHJpYWxzLF0gI1Jldm1vaW5nIHRoZSBvdXRsaWVyIHRyaWFscw0KICBhc3NpZ24oRXJyb3JfRmlsZSwgdG1wNCwgZW52aXIgPSAuR2xvYmFsRW52KSAjRXJyb3IgZmlsZSBoYXMgaW5jb3JyZWN0IGFuZCBjb3JyZWN0IHJlc3BvbnNlcw0KICBlcnJvcl90cmlhbHMgPC0gd2hpY2god2l0aCh0bXA0LCBUcmlhbF9Dcml0ZXJpb24gPT0gMSkpICNsaXN0IG9mIHJvd3MgdG8gcmVtb3ZlDQogIHRtcDUgPC0gdG1wNFstZXJyb3JfdHJpYWxzLF0gI1JlbW92aW5nIEVycm9yIFRyaWFscw0KICBhc3NpZ24oQ2xlYW5fRmlsZSwgdG1wNSwgZW52aXIgPSAuR2xvYmFsRW52KQ0KICBzdWJqZWN0X3ByZWxpbSA8LSBhZ2dyZWdhdGUoUlQgfiBHcm91cCArIFN1YmplY3QsIGRhdGE9dG1wNSwgbWVhbiwgbmEucm09VFJVRSkNCiAgcmV0dXJuKHN1YmplY3RfcHJlbGltKQ0KfQ0KVHJpYWxfQ2xlYW5pbmcoQ29tcGlsZWQsIkNsZWFuIiwiRXJyb3JzIiwiUHJlQW5hbHlzaXMiLCAyLDcsOSwxMDEsMTIsMTAzOCwyMSwyMiwxMDA3LDEwMTEsMTAwNCwxMDA4LDEwMTYpDQpgYGANCg0KYGBge3IsIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojI1dyaXRpbmcgSW50ZXJtZWRpYXRlIEZpbGUNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KI1dyaXRlcyBmaWxlIHdpdGggY2xlYW5lZCBkYXRhDQojRGlyZWN0b3J5IGlzICJDOi9Vc2Vycy9BbGV4YW5kZXIvRGVza3RvcC9JbnRlcm1lZGlhdGVzLyINCiNGaWxlX05hbWUgc2hvdWxkIGluY2x1ZGUgYSAudHh0DQpDbGVhbl9Xcml0ZSA8LSBmdW5jdGlvbihpbnB1dF9maWxlLCBGaWxlX05hbWUsIGRpcmVjdG9yeSl7DQogIGZpbGVwYXRoIDwtIGZpbGUucGF0aChkaXJlY3RvcnksIEZpbGVfTmFtZSkNCiAgd3JpdGUudGFibGUoaW5wdXRfZmlsZSwgZmlsZXBhdGgsIHNlcD0iXHQiKQ0KICANCn0NCmBgYA0KDQoNCiNSZXN1bHRzIFN1bW1hcnkNCg0KIyNDcmVhdGluZyBWYXJpYWJsZXMgb2YgSW50ZXJlc3QgdG8gc3VtbWFyaXplDQpgYGB7ciBTdW1tYXJ5IFZhcmlhYmxlc30NCiMjIyMjIyMjIyMjIyMjDQojU1VNTUFSWV9TVEFUUw0KIyMjIyMjIyMjIyMjIyMNCg0KI0Jhc2ljIEV4LUdhdXNzaWFuIEZ1bmN0aW9ucw0KbXV4IDwtIGZ1bmN0aW9uKHgsIG4gPSBsZW5ndGgoeCkpIHsgIyBUaGlzIGdpdmVzIG1lIG9ubHkgdGhlIG11DQoJayA8LSBzdGFydCA8LSBjKG11ID0gTmFOLCBzaWdtYSA9IE5hTiwgdGF1ID0gTmFOKQ0KCWtbMV0gPC0gbWVhbih4KQ0KCXhkZXYgPC0geCAtIGtbMV0NCglrWzJdIDwtIHN1bSh4ZGV2XjIpLyhuLTEpDQoJa1szXSA8LSBzdW0oeGRldl4zKS8obi0xKQ0KCWlmIChrWzNdID4gMCkNCgkJc3RhcnRbM10gPC0gKGtbM10vMileKDEvMykNCgllbHNlIHN0YXJ0WzNdIDwtIDAuOCpzZCh4KQ0KCXN0YXJ0WzJdIDwtIHNxcnQoYWJzKGtbMl0gLSBzdGFydFszXV4yKSkNCglzdGFydFsxXSA8LSBrWzFdIC0gc3RhcnRbM10NCglyZXR1cm4oc3RhcnRbMV0pDQp9DQoNCnNpZ3ggPC0gZnVuY3Rpb24oeCwgbiA9IGxlbmd0aCh4KSkgeyAjIFRISVMgR0lWRVMgTUUgT05MWSBUSEUgU0lHTUENCglrIDwtIHN0YXJ0IDwtIGMobXUgPSBOYU4sIHNpZ21hID0gTmFOLCB0YXUgPSBOYU4pDQoJa1sxXSA8LSBtZWFuKHgpDQoJeGRldiA8LSB4IC0ga1sxXQ0KCWtbMl0gPC0gc3VtKHhkZXZeMikvKG4tMSkNCglrWzNdIDwtIHN1bSh4ZGV2XjMpLyhuLTEpDQoJaWYgKGtbM10gPiAwKQ0KCQlzdGFydFszXSA8LSAoa1szXS8yKV4oMS8zKQ0KCWVsc2Ugc3RhcnRbM10gPC0gMC44KnNkKHgpDQoJc3RhcnRbMl0gPC0gc3FydChhYnMoa1syXSAtIHN0YXJ0WzNdXjIpKQ0KCXN0YXJ0WzFdIDwtIGtbMV0gLSBzdGFydFszXQ0KCXJldHVybihzdGFydFsyXSkNCn0NCg0KdGF1eCA8LSBmdW5jdGlvbih4LCBuID0gbGVuZ3RoKHgpKSB7ICMgVEhJUyBHSVZFUyBNRSBPTkxZIFRIRSBUQVUNCglrIDwtIHN0YXJ0IDwtIGMobXUgPSBOYU4sIHNpZ21hID0gTmFOLCB0YXUgPSBOYU4pDQoJa1sxXSA8LSBtZWFuKHgpDQoJeGRldiA8LSB4IC0ga1sxXQ0KCWtbMl0gPC0gc3VtKHhkZXZeMikvKG4tMSkNCglrWzNdIDwtIHN1bSh4ZGV2XjMpLyhuLTEpDQoJaWYgKGtbM10gPiAwKQ0KCQlzdGFydFszXSA8LSAoa1szXS8yKV4oMS8zKQ0KCWVsc2Ugc3RhcnRbM10gPC0gMC44KnNkKHgpDQoJc3RhcnRbMl0gPC0gc3FydChhYnMoa1syXSAtIHN0YXJ0WzNdXjIpKQ0KCXN0YXJ0WzFdIDwtIGtbMV0gLSBzdGFydFszXQ0KCXJldHVybihzdGFydFszXSkNCn0NCg0KI090aGVyIEZ1bmN0aW9ucw0KDQpTRSA8LSBmdW5jdGlvbih4KXtzZSA9IHNkKHgpL3NxcnQobGVuZ3RoKHgpKX0NCg0KRXJyb3JSYXRlIDwtIGZ1bmN0aW9uKHgpew0KICBFUiA9IGxlbmd0aCh3aGljaCh4ID09IDEpKS9sZW5ndGgod2hpY2goeCA9PSAxfCB4ID09MikpDQp9DQoNCmBgYA0KDQojI0NyZWF0aW5nIERhdGEgRnJhbWUgU3VtbWFyaWVzDQpTdWJqZWN0IGFuZCBpdGVtIHN1bW1hcmllcyBmb3Igd29yZHMgYW5kIGVycm9ycw0KYGBge3IgU3VtbWFyeSBGdW5jdGlvbnN9DQojbGlicmFyeShkYXRhLnRhYmxlKQ0KI1N1bW1hcnkgRGVmaW5pdGlvbiBQcm90b2NvbHMNCg0KU3ViamVjdF9SVCA8LSBsaXN0KENsZWFuJFN1YmplY3QsIENsZWFuJEdyb3VwLCBDbGVhbiRTZW1fUmVsLCBDbGVhbiRPcnRoX1JlbCwgQ2xlYW4kTGV4aWNhbGl0eSkNClN1YmplY3RfRXJyb3JzIDwtIGxpc3QgKEVycm9ycyRTdWJqZWN0LCBFcnJvcnMkR3JvdXAsIEVycm9ycyRTZW1fUmVsLCBFcnJvcnMkT3J0aF9SZWwsIEVycm9ycyRMZXhpY2FsaXR5KQ0KDQpJdGVtX1JUIDwtIGxpc3QoQ2xlYW4kVGFyZ2V0LCBDbGVhbiRMaXN0LCBDbGVhbiRTZW1fUmVsLCBDbGVhbiRPcnRoX1JlbCwgQ2xlYW4kTGV4aWNhbGl0eSkNCkl0ZW1fRXJyb3JzIDwtIGxpc3QoRXJyb3JzJFRhcmdldCwgRXJyb3JzJExpc3QsIEVycm9ycyRTZW1fUmVsLCBFcnJvcnMkT3J0aF9SZWwsIEVycm9ycyRMZXhpY2FsaXR5KQ0KDQoNCiMjU3ViamVjdCBtZWFucw0KU3ViamVjdCA8LSBhZ2dyZWdhdGUoUlQgfiBTdWJqZWN0ICsgR3JvdXAgKyBTZW1fUmVsICsgT3J0aF9SZWwgKyBMZXhpY2FsaXR5LCBkYXRhID0gQ2xlYW4sIEZVTiA9IG1lYW4sIG5hLnJtID0gVFJVRSkgI1JUIE1lYW5zDQpTdWJqZWN0JFNFIDwtIG5hLm9taXQoc2FwcGx5KHNwbGl0KENsZWFuJFJULCBTdWJqZWN0X1JUKSwgU0UpKSAjU0UNClN1YmplY3QkTXUgPC0gbmEub21pdChzYXBwbHkoc3BsaXQoQ2xlYW4kUlQsIFN1YmplY3RfUlQpLCBtdXgpKSAjTXUgDQpTdWJqZWN0JFNpZ21hIDwtIG5hLm9taXQoc2FwcGx5KHNwbGl0KENsZWFuJFJULCBTdWJqZWN0X1JUKSwgc2lneCkpICNTaWdtYQ0KU3ViamVjdCRUYXUgPC0gbmEub21pdChzYXBwbHkoc3BsaXQoQ2xlYW4kUlQsIFN1YmplY3RfUlQpLCB0YXV4KSkgI1RhdQ0KU3ViamVjdCRFcnJvclJhdGUgPC0gbmEub21pdChzYXBwbHkoc3BsaXQoRXJyb3JzJFRyaWFsX0NyaXRlcmlvbiwgU3ViamVjdF9FcnJvcnMpLCBFcnJvclJhdGUpKSAjRXJyb3IgUmF0ZQ0KDQojI0l0ZW0gbWVhbnMNCkl0ZW0gPC0gYWdncmVnYXRlKFJUIH4gVGFyZ2V0ICsgTGlzdCArIFNlbV9SZWwgKyBPcnRoX1JlbCArIExleGljYWxpdHksIGRhdGEgPSBDbGVhbiwgRlVOID0gbWVhbiwgbmEucm0gPSBUUlVFKSAjUlQgTWVhbnMNCkl0ZW0kU0UgPC0gbmEub21pdChzYXBwbHkoc3BsaXQoQ2xlYW4kUlQsIEl0ZW1fUlQpLCBTRSkpICNTRQ0KSXRlbSRNdSA8LSBuYS5vbWl0KHNhcHBseShzcGxpdChDbGVhbiRSVCwgSXRlbV9SVCksIG11eCkpICNNdSANCkl0ZW0kU2lnbWEgPC0gbmEub21pdChzYXBwbHkoc3BsaXQoQ2xlYW4kUlQsIEl0ZW1fUlQpLCBzaWd4KSkgI1NpZ21hDQpJdGVtJFRhdSA8LSBuYS5vbWl0KHNhcHBseShzcGxpdChDbGVhbiRSVCwgSXRlbV9SVCksIHRhdXgpKSAjVGF1DQpJdGVtJEVycm9yUmF0ZSA8LSBuYS5vbWl0KHNhcHBseShzcGxpdChFcnJvcnMkVHJpYWxfQ3JpdGVyaW9uLCBJdGVtX0Vycm9ycyksIEVycm9yUmF0ZSkpICNFcnJvciBSYXRlDQoNCiNDb25kaXRpb24tbGV2ZWwgbWVhbnMNCkNvbmRpdGlvbnMgPC0gYWdncmVnYXRlKGNiaW5kKFJULCBTRSwgTXUsIFNpZ21hLCBUYXUsIEVycm9yUmF0ZSkgfiBTZW1fUmVsICsgT3J0aF9SZWwgKyBMZXhpY2FsaXR5LCBkYXRhID0gU3ViamVjdCwgRlVOID0gbWVhbikNCnByaW50KENvbmRpdGlvbnMpDQpgYGANCg0KIyNTcGxpdHRpbmcgTGF0ZW5jeSBhbmQgRXJyb3IgZmlsZXMgaW50byBXb3JkcyBhbmQgTm9uLXdvcmRzDQpgYGB7ciBGaWxlX1NwbGl0fQ0KIyNTcGxpdHRpbmcgRmlsZSANCiMjIyMjIyMjIyMjIyMjIyMjIyMNCiNBbHdheXMgc3BsaXQgd29yZHMvbm9ud29yZHMgZmlydHMhISENCiNGaWxlX05hbWUxLzIsIHN1YnNldDEvMiwgYW5kIGNyaXRlcmlvbl92YXJpYWJsZSBzaG91bGQgYmUgaW4gIiAiDQoNCkZpbGVfU3BsaXQgPC0gZnVuY3Rpb24oaW5wdXRfZmlsZSwgY3JpdGVyaW9uX3ZhcmlhYmxlLCBGaWxlX05hbWUxLHN1YnNldDEsIEZpbGVfTmFtZTIsc3Vic2V0Mil7DQogIHRtcDEgPC0gaW5wdXRfZmlsZVtpbnB1dF9maWxlW2NyaXRlcmlvbl92YXJpYWJsZV09PXN1YnNldDEsXQ0KICBhc3NpZ24oRmlsZV9OYW1lMSwgdG1wMSwgZW52aXIgPSAuR2xvYmFsRW52KQ0KICB0bXAyIDwtIGlucHV0X2ZpbGVbaW5wdXRfZmlsZVtjcml0ZXJpb25fdmFyaWFibGVdPT1zdWJzZXQyLF0NCiAgYXNzaWduKEZpbGVfTmFtZTIsIHRtcDIsIGVudmlyID0gLkdsb2JhbEVudikNCiAgDQp9DQoNCiMjU3ViamVjdCBhbmQgSXRlbSBMYXRlbmN5IGFuZCBFcnJvciBBbmFseXNlcw0KI0RhdGEgRnJhbWVzIGZvciBTdWJqZWN0IExhdGVuY3kgYW5kIEVycm9yIFN1bW1hcmllcw0KRmlsZV9TcGxpdChTdWJqZWN0LCAiTGV4aWNhbGl0eSIsICJXb3JkX1N1YmplY3QiLCAid29yZCIsICJOb253b3JkX1N1YmplY3QiLCAibm9ud29yZCIpDQojRGF0YSBmcmFtZXMgZm9yIEl0ZW0gTGF0ZW5jeSBhbmQgRXJyb3IgU3VtbWFyaWVzDQpGaWxlX1NwbGl0KEl0ZW0sICJMZXhpY2FsaXR5IiwgIldvcmRfSXRlbSIsICJ3b3JkIiwgIk5vbndvcmRfSXRlbSIsICJub253b3JkIikNCg0KIyNUcmlhbCBMZXZlbCBEYXRhIGZvciBHTE1FUiBhbmFseXNlcyBhbmQgUXVhcnRpbGUgQW5hbHlzZXMNCiNDbGVhbiBEYXRhZnJtYWVzDQpGaWxlX1NwbGl0KENsZWFuLCAiTGV4aWNhbGl0eSIsICJXb3JkUlRfVHJpYWwiLCAid29yZCIsICJOb253b3JkUlRfVHJpYWwiLCAibm9ud29yZCIpDQojRXJyb3IgRGF0YWZyYW1lcw0KRmlsZV9TcGxpdChFcnJvcnMsICJMZXhpY2FsaXR5IiwgIldvcmRFcnJvcnNfVHJpYWwiLCAid29yZCIsICJOb253b3JkRXJyb3JzX1RyaWFsIiwgIm5vbndvcmQiKQ0KDQoNCmBgYA0KDQoNCiM9PT09PT09PQ0KI0FuYWx5c2VzDQojPT09PT09PT0NCg0KIyNBTk9WQXMNCg0KIyMjTGF0ZW5jaWVzDQpgYGB7ciBsYXRlbmN5IEFOT1ZBc30NCmxpYnJhcnkoYWZleCkNCmxpYnJhcnkoYXBhKQ0KbGlicmFyeShlbW1lYW5zKQ0KDQojV29yZCBTdWJqZWN0LUxldmVsIEFOT1ZBDQoNCkZzVyA8LWFvdl9leigiU3ViamVjdCIsICNTdWJqZWN0IHZhcmlhYmxlIA0KICAgICAgICAgICAgIlJUIiwgI2RlcGVuZGVudCB2YXJpYWJsZQ0KICAgICAgICAgICAgV29yZF9TdWJqZWN0LCAjZGF0YXNldA0KICAgICAgICAgICAgYmV0d2VlbiA9IGMoIkdyb3VwIiksDQogICAgICAgICAgICB3aXRoaW4gPSBjKCJTZW1fUmVsIiwiT3J0aF9SZWwiKSwNCiAgICAgICAgICAgICNhZmV4X29wdGlvbnMoY29ycmVjdGlvbl9hb3YgPSAibm9uZSIpLCAjQ29ycmVjdGlvbiBvZiBkLmYuISEhDQogICAgICAgICAgICB0eXBlID0gMywNCiAgICAgICAgICAgIGZhY3Rvcml6ZSA9IFRSVUUpDQpGc1dfb21uaWJ1cyA8LSBhbm92YShGc1cpDQpwcmludCgiV29yZCBTdWJqZWN0LUxldmVsIEFOT1ZBIikNCnByaW50KEZzV19vbW5pYnVzKQ0KYW5vdmFfYXBhKEZzVykNCg0KbUZzVyA8LSBlbW1lYW5zKEZzVyx+U2VtX1JlbHxPcnRoX1JlbCkNCm1Gc1cNCnBhaXJzKG1Gc1cpDQoNCg0KDQojV29yZCBJdGVtLUxldmVsIEFOT1ZBDQoNCkZpVyA8LWFvdl9leigiVGFyZ2V0IiwgI1N1YmplY3QgdmFyaWFibGUgDQogICAgICAgICAgICAiUlQiLCAjZGVwZW5kZW50IHZhcmlhYmxlDQogICAgICAgICAgICBXb3JkX0l0ZW0sICNkYXRhc2V0DQogICAgICAgICAgICBiZXR3ZWVuID0gYygiTGlzdCIpLA0KICAgICAgICAgICAgd2l0aGluID0gYygiU2VtX1JlbCIsIk9ydGhfUmVsIiksDQogICAgICAgICAgICAjYWZleF9vcHRpb25zKGNvcnJlY3Rpb25fYW92ID0gIm5vbmUiKSwgI0NvcnJlY3Rpb24gb2YgZC5mLiEhIQ0KICAgICAgICAgICAgdHlwZSA9IDMsDQogICAgICAgICAgICBmYWN0b3JpemUgPSBUUlVFKQ0KDQoNCkZpV19vbW5pYnVzIDwtIGFub3ZhKEZpVykNCnByaW50KCJXb3JkIEl0ZW0tTGV2ZWwgQU5PVkEiKQ0KcHJpbnQoRmlXX29tbmlidXMpDQphbm92YV9hcGEoRmlXKQ0KDQojTm9ud29yZCBTdWJqZWN0LUxldmVsIEFOT1ZBDQoNCkZzTncgPC1hb3ZfZXooIlN1YmplY3QiLCAjU3ViamVjdCB2YXJpYWJsZSANCiAgICAgICAgICAgICJSVCIsICNkZXBlbmRlbnQgdmFyaWFibGUNCiAgICAgICAgICAgIE5vbndvcmRfU3ViamVjdCwgI2RhdGFzZXQNCiAgICAgICAgICAgIGJldHdlZW4gPSBjKCJHcm91cCIpLA0KICAgICAgICAgICAgd2l0aGluID0gYygiT3J0aF9SZWwiKSwNCiAgICAgICAgICAgICNhZmV4X29wdGlvbnMoY29ycmVjdGlvbl9hb3YgPSAibm9uZSIpLCAjQ29ycmVjdGlvbiBvZiBkLmYuISEhDQogICAgICAgICAgICB0eXBlID0gMywNCiAgICAgICAgICAgIGZhY3Rvcml6ZSA9IFRSVUUpDQpGc053X29tbmlidXMgPC0gYW5vdmEoRnNOdykNCnByaW50KCJOb253b3JkIFN1YmplY3QtTGV2ZWwgQU5PVkEiKQ0KcHJpbnQoRnNOd19vbW5pYnVzKQ0KYW5vdmFfYXBhKEZzTncpDQoNCiNOb253b3JkIEl0ZW0tTGV2ZWwgQU5PVkENCg0KRmlOdyA8LWFvdl9leigiVGFyZ2V0IiwgI1N1YmplY3QgdmFyaWFibGUgDQogICAgICAgICAgICAiUlQiLCAjZGVwZW5kZW50IHZhcmlhYmxlDQogICAgICAgICAgICBOb253b3JkX0l0ZW0sICNkYXRhc2V0DQogICAgICAgICAgICBiZXR3ZWVuID0gYygiTGlzdCIpLA0KICAgICAgICAgICAgd2l0aGluID0gYygiT3J0aF9SZWwiKSwNCiAgICAgICAgICAgICNhZmV4X29wdGlvbnMoY29ycmVjdGlvbl9hb3YgPSAibm9uZSIpLCAjQ29ycmVjdGlvbiBvZiBkLmYuISEhDQogICAgICAgICAgICB0eXBlID0gMywNCiAgICAgICAgICAgIGZhY3Rvcml6ZSA9IFRSVUUpDQoNCg0KRmlOd19vbW5pYnVzIDwtIGFub3ZhKEZpTncpDQpwcmludCgiTm9ud29yZCBTdWJqZWN0LUxldmVsIEFOT1ZBIikNCnByaW50KEZpTndfb21uaWJ1cykNCmFub3ZhX2FwYShGaU53KQ0KDQpgYGANCg0KIyMjRXJyb3JzDQpgYGB7ciBFcnJvciBSYXRlIEFOT1ZBc30NCmxpYnJhcnkoYWZleCkNCmxpYnJhcnkoYXBhKQ0KbGlicmFyeShlbW1lYW5zKQ0KI1dvcmQgU3ViamVjdC1MZXZlbCBBTk9WQQ0KDQpGc1cgPC1hb3ZfZXooIlN1YmplY3QiLCAjU3ViamVjdCB2YXJpYWJsZSANCiAgICAgICAgICAgICJFcnJvclJhdGUiLCAjZGVwZW5kZW50IHZhcmlhYmxlDQogICAgICAgICAgICBXb3JkX1N1YmplY3QsICNkYXRhc2V0DQogICAgICAgICAgICBiZXR3ZWVuID0gYygiR3JvdXAiKSwNCiAgICAgICAgICAgIHdpdGhpbiA9IGMoIlNlbV9SZWwiLCJPcnRoX1JlbCIpLA0KICAgICAgICAgICAgI2FmZXhfb3B0aW9ucyhjb3JyZWN0aW9uX2FvdiA9ICJub25lIiksICNDb3JyZWN0aW9uIG9mIGQuZi4hISENCiAgICAgICAgICAgIHR5cGUgPSAzLA0KICAgICAgICAgICAgZmFjdG9yaXplID0gVFJVRSkNCkZzV19vbW5pYnVzIDwtIGFub3ZhKEZzVykNCnByaW50KCJXb3JkIFN1YmplY3QtTGV2ZWwgQU5PVkEiKQ0KcHJpbnQoRnNXX29tbmlidXMpDQphbm92YV9hcGEoRnNXKQ0KDQptRnNXIDwtIGVtbWVhbnMoRnNXLH5PcnRoX1JlbHxTZW1fUmVsKQ0KbUZzVw0KcGFpcnMobUZzVykNCg0KDQojV29yZCBJdGVtLUxldmVsIEFOT1ZBDQoNCkZpVyA8LWFvdl9leigiVGFyZ2V0IiwgI1N1YmplY3QgdmFyaWFibGUgDQogICAgICAgICAgICAiRXJyb3JSYXRlIiwgI2RlcGVuZGVudCB2YXJpYWJsZQ0KICAgICAgICAgICAgV29yZF9JdGVtLCAjZGF0YXNldA0KICAgICAgICAgICAgYmV0d2VlbiA9IGMoIkxpc3QiKSwNCiAgICAgICAgICAgIHdpdGhpbiA9IGMoIlNlbV9SZWwiLCJPcnRoX1JlbCIpLA0KICAgICAgICAgICAgI2FmZXhfb3B0aW9ucyhjb3JyZWN0aW9uX2FvdiA9ICJub25lIiksICNDb3JyZWN0aW9uIG9mIGQuZi4hISENCiAgICAgICAgICAgIHR5cGUgPSAzLA0KICAgICAgICAgICAgZmFjdG9yaXplID0gVFJVRSkNCg0KDQpGaVdfb21uaWJ1cyA8LSBhbm92YShGaVcpDQpwcmludCgiV29yZCBJdGVtLUxldmVsIEFOT1ZBIikNCnByaW50KEZpV19vbW5pYnVzKQ0KYW5vdmFfYXBhKEZpVykNCg0KI05vbndvcmQgU3ViamVjdC1MZXZlbCBBTk9WQQ0KDQpGc053IDwtYW92X2V6KCJTdWJqZWN0IiwgI1N1YmplY3QgdmFyaWFibGUgDQogICAgICAgICAgICAiRXJyb3JSYXRlIiwgI2RlcGVuZGVudCB2YXJpYWJsZQ0KICAgICAgICAgICAgTm9ud29yZF9TdWJqZWN0LCAjZGF0YXNldA0KICAgICAgICAgICAgYmV0d2VlbiA9IGMoIkdyb3VwIiksDQogICAgICAgICAgICB3aXRoaW4gPSBjKCJPcnRoX1JlbCIpLA0KICAgICAgICAgICAgI2FmZXhfb3B0aW9ucyhjb3JyZWN0aW9uX2FvdiA9ICJub25lIiksICNDb3JyZWN0aW9uIG9mIGQuZi4hISENCiAgICAgICAgICAgIHR5cGUgPSAzLA0KICAgICAgICAgICAgZmFjdG9yaXplID0gVFJVRSkNCkZzTndfb21uaWJ1cyA8LSBhbm92YShGc053KQ0KcHJpbnQoIk5vbndvcmQgU3ViamVjdC1MZXZlbCBBTk9WQSIpDQpwcmludChGc053X29tbmlidXMpDQphbm92YV9hcGEoRnNOdykNCg0KI05vbndvcmQgSXRlbS1MZXZlbCBBTk9WQQ0KDQpGaU53IDwtYW92X2V6KCJUYXJnZXQiLCAjU3ViamVjdCB2YXJpYWJsZSANCiAgICAgICAgICAgICJFcnJvclJhdGUiLCAjZGVwZW5kZW50IHZhcmlhYmxlDQogICAgICAgICAgICBOb253b3JkX0l0ZW0sICNkYXRhc2V0DQogICAgICAgICAgICBiZXR3ZWVuID0gYygiTGlzdCIpLA0KICAgICAgICAgICAgd2l0aGluID0gYygiT3J0aF9SZWwiKSwNCiAgICAgICAgICAgICNhZmV4X29wdGlvbnMoY29ycmVjdGlvbl9hb3YgPSAibm9uZSIpLCAjQ29ycmVjdGlvbiBvZiBkLmYuISEhDQogICAgICAgICAgICB0eXBlID0gMywNCiAgICAgICAgICAgIGZhY3Rvcml6ZSA9IFRSVUUpDQoNCg0KRmlOd19vbW5pYnVzIDwtIGFub3ZhKEZpTncpDQpwcmludCgiTm9ud29yZCBTdWJqZWN0LUxldmVsIEFOT1ZBIikNCnByaW50KEZpTndfb21uaWJ1cykNCmFub3ZhX2FwYShGaU53KQ0KDQpgYGANCg0KIyNHTE1FDQoNCiMjI0xhdGVuY2llcw0KYGBge3IgR0xNRVIgb24gTGF0ZW5jaWVzfQ0KI1RST1VCTEVTSE9PVElORzogY2hlY2sgb3V0IHRoaXMgcGFnZTogaHR0cDovL3JwdWJzLmNvbS9iYm9sa2VyL2xtZTR0cm91YmxlMQ0KDQpsaWJyYXJ5KGxtZTQpDQpsaWJyYXJ5KGNhcikNCg0Kb3B0aW9ucyhjb250cmFzdHMgPSBjKCJjb250ci5zdW0iLCJjb250ci5wb2x5IikpDQoNCg0KI0ludmVyc2UgR2F1c3NpYW4gRGlzdHJpYnV0aW9uDQp3b3JkUlRfaW52Z2F1c3MgPC0gZ2xtZXIoUlQgfiBPcnRoX1JlbCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKDF8VGFyZ2V0KSArICgxfFN1YmplY3QpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gV29yZFJUX1RyaWFsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBpbnZlcnNlLmdhdXNzaWFuKGxpbms9ImlkZW50aXR5IikpDQpzdW1tYXJ5KHdvcmRSVF9pbnZnYXVzcykNCiNBbm92YSh3b3JkUlRfaW52Z2F1c3MpDQoNCg0KI3Jlc3RhcnQgZnJvbSBwcmV2aW91cyBmaXQNCg0KI3NzIDwtIGdldE1FKHdvcmRSVF9pbnZnYXVzcyxjKCJ0aGV0YSIsImZpeGVmIikpDQojd29yZFJUX2ludmdhdXNzMiA8LSB1cGRhdGUod29yZFJUX2ludmdhdXNzLHN0YXJ0PXNzLGNvbnRyb2w9Z2xtZXJDb250cm9sKG9wdEN0cmw9bGlzdChtYXhmdW49MWU5KSkpDQojc3VtbWFyeSh3b3JkUlRfaW52Z2F1c3MyKQ0KDQoNCmBgYA0KDQojIyNFcnJvcnMgDQoNCmBgYHtyIGVjaG89VFJVRX0NCmxpYnJhcnkobG1lNCkNCm9wdGlvbnMoY29udHJhc3RzID0gYygiY29udHIuc3VtIiwiY29udHIucG9seSIpKQ0KDQojT2J0YWluaW5nIHRoZSBtYXhpbWFsIG1vZGVsIChUaGlzIGlzIHRoZSBtb3N0IGNvbXBsZXggbW9kZWwgd2hpY2ggY291bGQgc3RpbGwgY29udmVyZ2UpDQp3b3JkRXJyb3JfQmlub21pYWwgPC0gZ2xtZXIoVHJpYWxfQ3JpdGVyaW9uIH4gT3J0aF9SZWwgKyAgICAjRml4ZWQgZWZmZWN0cyBhbmQgdGhlaXIgaW50ZXJhY3Rpb25zDQogICAgICAgICAgICAgICAgICAgKDF8U3ViamVjdCkgKyAoMXxUYXJnZXQpLCAjUmFuZG9tIGVmZmVjdHMgd2l0aCByYW5kb20gaW50ZXJjZXB0cyAgIA0KICAgICAgICAgICAgICAgICAgIGRhdGEgPSBXb3JkRXJyb3JzX1RyaWFsLA0KICAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsDQogICAgICAgICAgICAgICAgICAgbkFHTyA9IDENCiAgICAgICAgICAgICAgICAgICApDQpzdW1tYXJ5KHdvcmRFcnJvcl9CaW5vbWlhbCkNCg0KYGBgDQoNCg0KDQojPT09PT09PT09PT09PT09PT0NCiNRdWFudGlsZSBBbmFseXNlcw0KIz09PT09PT09PT09PT09PT09DQoNCiMjU2V0dGluZyB1cCBRdWFydGlsZSBBbmFseXNlcw0KYGBge3IgUXVhcnRpbGUgQXNzaWdufQ0KDQpRdWFudGlsZV9Bc3NpZ24gPC0gZnVuY3Rpb24oaW5wdXRfZmlsZSwgRmlsZV9OYW1lLCBWYXIsIFF1YW50aWxlTGFiZWwsIFF1YW50aWxlU2l6ZSwgTWF4UmFuayl7DQogIGlucHV0X2ZpbGUkcmFuayA8LSBhdmUoaW5wdXRfZmlsZSRSVCwgaW5wdXRfZmlsZSRTdWJqZWN0LCBpbnB1dF9maWxlWyxWYXJdLCBGVU4gPSByYW5rKQ0KICBpbnB1dF9maWxlJHJhbmsgPC0gYXMuaW50ZWdlcihpbnB1dF9maWxlJHJhbmspDQogIGkgPC0gMQ0KICB3aGlsZShpKlF1YW50aWxlU2l6ZSA8IE1heFJhbmspew0KICAgIGlucHV0X2ZpbGUkdG1wW2lucHV0X2ZpbGUkcmFuayA+PShpLTEpKlF1YW50aWxlU2l6ZSArIDEgJiBpbnB1dF9maWxlJHJhbmsgPD0gUXVhbnRpbGVTaXplKmldIDwtIGkNCiAgICBpIDwtIGkgKyAxDQogIH0NCiAgaW5wdXRfZmlsZVsgLFF1YW50aWxlTGFiZWxdIDwtIGlucHV0X2ZpbGUkdG1wDQogIGlucHV0X2ZpbGUgPC0gaW5wdXRfZmlsZVsgLCAhbmFtZXMoaW5wdXRfZmlsZSkgJWluJSBjKCJ0bXAiLCJyYW5rIildIA0KICBhc3NpZ24oRmlsZV9OYW1lLCBpbnB1dF9maWxlLCBlbnZpciA9IC5HbG9iYWxFbnYpDQp9DQoNCldvcmRFcnJvcnNfVHJpYWxRIDwtIFdvcmRFcnJvcnNfVHJpYWwNCldvcmRSVF9UcmlhbFE8LSBXb3JkUlRfVHJpYWwNCg0KUXVhbnRpbGVfQXNzaWduKFdvcmRSVF9UcmlhbFEsIldvcmRSVF9UcmlhbFEiLCAiT3J0aF9SZWwiLCAiT3J0aFJlbFEiLCA3LCAzNikNClF1YW50aWxlX0Fzc2lnbihXb3JkRXJyb3JzX1RyaWFsUSwiV29yZEVycm9yc19UcmlhbFEiLCAiT3J0aF9SZWwiLCAiT3J0aFJlbFEiLCA3LCAzNikNCg0KUXVhbnRpbGVfQXNzaWduKFdvcmRSVF9UcmlhbFEsIldvcmRSVF9UcmlhbFEiLCAiU2VtX1JlbCIsICJTZW1SZWxRIiwgNywgMzYpDQpRdWFudGlsZV9Bc3NpZ24oV29yZEVycm9yc19UcmlhbFEsIldvcmRFcnJvcnNfVHJpYWxRIiwgIlNlbV9SZWwiLCAiU2VtUmVsUSIsIDcsIDM2KQ0KDQpXb3JkUlRfVHJpYWxfT3J0aFJlbFEgPC0gc3Vic2V0KFdvcmRSVF9UcmlhbFEsIE9ydGhSZWxRID49MSAmIE9ydGhSZWxRIDw9NCkNCldvcmRSVF9UcmlhbF9TZW1SZWxRIDwtIHN1YnNldChXb3JkUlRfVHJpYWxRLCBTZW1SZWxRID49MSAmIFNlbVJlbFEgPD00KQ0KDQpgYGANCg0KIyNBTk9WQXMNCg0KIyMjTGF0ZW5jaWVzDQpgYGB7ciBRdWFydGlsZSBMYXRlbmN5IEFuYWx5c2VzfQ0KbGlicmFyeShhZmV4KQ0KbGlicmFyeShlbW1lYW5zKQ0KbGlicmFyeShhcGEpDQoNCiMjT3J0aFJlbFEgTGF0ZW5jaWVzDQojIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQojU3ViamVjdCBBbmFseXNpcw0KRnNPcnRoUSA8LWFvdl9leigiU3ViamVjdCIsICNTdWJqZWN0IHZhcmlhYmxlIA0KICAgICAgICAgICAgIlJUIiwgI2RlcGVuZGVudCB2YXJpYWJsZQ0KICAgICAgICAgICAgV29yZFJUX1RyaWFsX09ydGhSZWxRLCAjZGF0YXNldA0KICAgICAgICAgICAgd2l0aGluID0gYygiT3J0aF9SZWwiLCJPcnRoUmVsUSIpLA0KICAgICAgICAgICAgYmV0d2VlbiA9IGMoIkdyb3VwIiksDQogICAgICAgICAgICBjb3JyZWN0aW9uID0gIm5vbmUiLCAjQ29ycmVjdGlvbiBvZiBkLmYuISEhDQogICAgICAgICAgICB0eXBlID0gMywNCiAgICAgICAgICAgIGZhY3Rvcml6ZSA9IFRSVUUpDQpwcmludCgiU3ViamVjdC1MZXZlbCBBTk9WQSIpDQpwcmludChhbm92YShGc09ydGhRKSkNCmFub3ZhX2FwYShGc09ydGhRKQ0KTXNPcnRoUSA8LSBlbW1lYW5zKEZzT3J0aFEsIH4gT3J0aF9SZWx8T3J0aFJlbFEpDQoNCiNJdGVtIEFuYWx5c2lzDQpGaU9ydGhRIDwtYW92X2V6KCJUYXJnZXQiLCAjU3ViamVjdCB2YXJpYWJsZSANCiAgICAgICAgICAgICJSVCIsICNkZXBlbmRlbnQgdmFyaWFibGUNCiAgICAgICAgICAgIFdvcmRSVF9UcmlhbF9PcnRoUmVsUSwgI2RhdGFzZXQNCiAgICAgICAgICAgIHdpdGhpbiA9IGMoIk9ydGhfUmVsIiwiT3J0aFJlbFEiKSwNCiAgICAgICAgICAgIGJldHdlZW4gPSBjKCJMaXN0IiksDQogICAgICAgICAgICBjb3JyZWN0aW9uID0gIm5vbmUiLCAjQ29ycmVjdGlvbiBvZiBkLmYuISEhDQogICAgICAgICAgICB0eXBlID0gMywNCiAgICAgICAgICAgIGZhY3Rvcml6ZSA9IFRSVUUpDQpwcmludCgiSXRlbS1MZXZlbCBBTk9WQSIpDQpwcmludChhbm92YShGaU9ydGhRKSkNCmFub3ZhX2FwYShGaU9ydGhRKQ0KTXNPcnRoUSA8LSBlbW1lYW5zKEZpT3J0aFEsIH4gT3J0aF9SZWx8T3J0aFJlbFEpDQoNCiMjU2VtUmVsUSBMYXRlbmNpZXMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiNTdWJqZWN0IEFuYWx5c2lzDQpGc1NlbVEgPC1hb3ZfZXooIlN1YmplY3QiLCAjU3ViamVjdCB2YXJpYWJsZSANCiAgICAgICAgICAgICJSVCIsICNkZXBlbmRlbnQgdmFyaWFibGUNCiAgICAgICAgICAgIFdvcmRSVF9UcmlhbF9TZW1SZWxRLCAjZGF0YXNldA0KICAgICAgICAgICAgd2l0aGluID0gYygiU2VtX1JlbCIsIlNlbVJlbFEiKSwNCiAgICAgICAgICAgIGJldHdlZW4gPSBjKCJHcm91cCIpLA0KICAgICAgICAgICAgY29ycmVjdGlvbiA9ICJub25lIiwgI0NvcnJlY3Rpb24gb2YgZC5mLiEhIQ0KICAgICAgICAgICAgdHlwZSA9IDMsDQogICAgICAgICAgICBmYWN0b3JpemUgPSBUUlVFKQ0KcHJpbnQoIlN1YmplY3QtTGV2ZWwgQU5PVkEiKQ0KcHJpbnQoYW5vdmEoRnNTZW1RKSkNCmFub3ZhX2FwYShGc1NlbVEpDQpNc09ydGhRIDwtIGVtbWVhbnMoRnNTZW1RLCB+IFNlbV9SZWx8U2VtUmVsUSkNCg0KI0l0ZW0gQW5hbHlzaXMNCkZpU2VtUSA8LWFvdl9leigiVGFyZ2V0IiwgI1N1YmplY3QgdmFyaWFibGUgDQogICAgICAgICAgICAiUlQiLCAjZGVwZW5kZW50IHZhcmlhYmxlDQogICAgICAgICAgICBXb3JkUlRfVHJpYWxfU2VtUmVsUSwgI2RhdGFzZXQNCiAgICAgICAgICAgIHdpdGhpbiA9IGMoIlNlbV9SZWwiLCJTZW1SZWxRIiksDQogICAgICAgICAgICBiZXR3ZWVuID0gYygiTGlzdCIpLA0KICAgICAgICAgICAgY29ycmVjdGlvbiA9ICJub25lIiwgI0NvcnJlY3Rpb24gb2YgZC5mLiEhIQ0KICAgICAgICAgICAgdHlwZSA9IDMsDQogICAgICAgICAgICBmYWN0b3JpemUgPSBUUlVFKQ0KcHJpbnQoIkl0ZW0tTGV2ZWwgQU5PVkEiKQ0KcHJpbnQoYW5vdmEoRmlTZW1RKSkNCmFub3ZhX2FwYShGaVNlbVEpDQpNc09ydGhRIDwtIGVtbWVhbnMoRmlTZW1RLCB+IFNlbV9SZWx8U2VtUmVsUSkNCg0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3JlcGVsKQ0KbGlicmFyeShncmlkRXh0cmEpDQoNCg0KT3J0aFJlbFBsb3QgPC0gZW1taXAoRnNPcnRoUSwgT3J0aF9SZWwgfiBPcnRoUmVsUSwgQ0lzID0gVFJVRSwgZW5naW5lID0gImdncGxvdCIsIHBsb3RpdCA9IEZBTFNFKQ0KT3J0aFJlbFBsb3QkdHZhciA8LSBhcy5mYWN0b3IoT3J0aFJlbFBsb3QkdHZhcikNCmxldmVscyhPcnRoUmVsUGxvdCR0dmFyKSA8LSBjKGxldmVscyhPcnRoUmVsUGxvdCR0dmFyKSwgIk5laWdoYm9yIikNCmxldmVscyhPcnRoUmVsUGxvdCR0dmFyKSA8LSBjKGxldmVscyhPcnRoUmVsUGxvdCR0dmFyKSwgIk5vbi1uZWlnaGJvciIpDQpPcnRoUmVsUGxvdFtPcnRoUmVsUGxvdCA9PSAicmVsYXRlZCJdIDwtICJOZWlnaGJvciINCk9ydGhSZWxQbG90W09ydGhSZWxQbG90ID09ICJ1bnJlbGF0ZWQiXSA8LSAiTm9uLW5laWdoYm9yIg0KcHJpbnQoT3J0aFJlbFBsb3QpDQoNClNlbVJlbFBsb3QgPC0gZW1taXAoRnNTZW1RLCBTZW1fUmVsIH4gU2VtUmVsUSwgQ0lzID0gVFJVRSwgZW5naW5lID0gImdncGxvdCIsIHBsb3RpdCA9IEZBTFNFKQ0KU2VtUmVsUGxvdCR0dmFyIDwtIGFzLmZhY3RvcihTZW1SZWxQbG90JHR2YXIpDQpsZXZlbHMoU2VtUmVsUGxvdCR0dmFyKSA8LSBjKGxldmVscyhTZW1SZWxQbG90JHR2YXIpLCAiUmVsYXRlZCIpDQpsZXZlbHMoU2VtUmVsUGxvdCR0dmFyKSA8LSBjKGxldmVscyhTZW1SZWxQbG90JHR2YXIpLCAiVW5yZWxhdGVkIikNClNlbVJlbFBsb3RbU2VtUmVsUGxvdCA9PSAicmVsYXRlZCJdIDwtICJSZWxhdGVkIg0KU2VtUmVsUGxvdFtTZW1SZWxQbG90ID09ICJ1bnJlbGF0ZWQiXSA8LSAiVW5yZWxhdGVkIg0KcHJpbnQoU2VtUmVsUGxvdCkNCg0KVGhlbWVfQWRkIDwtIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDEyLCBiYXNlX2ZhbWlseSA9ICIiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLHNpemU9MTIpKSArDQogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSxwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArIA0KICB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiwgbGluZXR5cGUgPSAic29saWQiKSkgKw0KICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDEsMCksbGVnZW5kLnBvc2l0aW9uPWMoMSwwLjA1KSwgDQogICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT0xMiksDQogICAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoKGZpbGwgPSBOQSkpKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIixzaXplPTEyKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLHNpemU9MTIpKQ0KDQpRdWFydGlsZUxhYmVscyA8LSBjKCIxIiwgIjIiLCAiMyIsICI0IiApDQoNCg0KT3J0aFJlbFFfUGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IE9ydGhSZWxQbG90LCBhZXMoeCA9IHh2YXIsIHk9eXZhciwgZ3JvdXAgPSB0dmFyKSkrDQogIGdlb21fbGluZShhZXMobGluZXR5cGU9dHZhciksIHNpemU9MSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUxDTCwgeW1heD1VQ0wpLCB3aWR0aD0uMSkgKw0KICBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsPWZvcm1hdChPcnRoUmVsUGxvdCR5dmFyLCBkaWdpdHM9MykpLA0KICAgICAgICAgICAgICAgICAgc2l6ZSA9IDQsZGlyZWN0aW9uID0gInkiLCBoanVzdCA9IDIsIHNlZ21lbnQuY29sb3VyID0gTkEpICsNCiAgbGFicyh0aXRsZSA9ICJPcnRob2dyYXBoaWMgUHJpbWluZyBFZmZlY3QiLCB4ID0gIlF1YW50aWxlIiwgeSA9ICJSVCAobXMpIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIlgxIiwgIlgyIiwgIlgzIiwgIlg0IiksbGFiZWxzPSBRdWFydGlsZUxhYmVscykgKw0KICBUaGVtZV9BZGQNCiAgDQoNCnByaW50KE9ydGhSZWxRX1Bsb3QpDQoNCg0KU2VtUmVsUV9QbG90IDwtIGdncGxvdChkYXRhID0gU2VtUmVsUGxvdCwgYWVzKHggPSB4dmFyLCB5PXl2YXIsIGdyb3VwID0gdHZhcikpKw0KICBnZW9tX2xpbmUoYWVzKGxpbmV0eXBlPXR2YXIpLCBzaXplPTEpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1MQ0wsIHltYXg9VUNMKSwgd2lkdGg9LjEpICsNCiAgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbD1mb3JtYXQoU2VtUmVsUGxvdCR5dmFyLCBkaWdpdHM9MykpLA0KICAgICAgICAgICAgICAgICAgc2l6ZSA9IDQsIGRpcmVjdGlvbiA9ICJ5IiwgaGp1c3QgPSAyLCBzZWdtZW50LmNvbG91ciA9IE5BKSArDQogIGxhYnModGl0bGUgPSAiU2VtYW50aWMgUHJpbWluZyBFZmZlY3QiLCB4ID0gIlF1YW50aWxlIiwgeSA9ICJSVCAobXMpIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIlgxIiwgIlgyIiwgIlgzIiwgIlg0IiksbGFiZWxzPSBRdWFydGlsZUxhYmVscykgKw0KICBUaGVtZV9BZGQNCiAgDQoNCnByaW50KFNlbVJlbFFfUGxvdCkNCg0KZ2dzYXZlKCJDOi9Vc2Vycy9BbGV4YW5kZXIvRGVza3RvcC9NeVBsb3RzL0V4cDFMb25nU09BX09ydGhSZWwucG5nIiwgcGxvdCA9IE9ydGhSZWxRX1Bsb3Qsc2NhbGUgPSAxLCB3aWR0aCA9IDE2LCBoZWlnaHQgPSA5LCB1bml0cyA9IGMoImNtIiksIGRwaSA9IDMwMCwgbGltaXRzaXplID0gVFJVRSkNCg0KZ2dzYXZlKCJDOi9Vc2Vycy9BbGV4YW5kZXIvRGVza3RvcC9NeVBsb3RzL0V4cDFMb25nU09BX1NlbVJlbC5wbmciLCBwbG90ID0gU2VtUmVsUV9QbG90LHNjYWxlID0gMSwgd2lkdGggPSAxNiwgaGVpZ2h0ID0gOSwgdW5pdHMgPSBjKCJjbSIpLCBkcGkgPSAzMDAsIGxpbWl0c2l6ZSA9IFRSVUUpDQoNCiNwZGYoIkM6L1VzZXJzL0FsZXhhbmRlci9EZXNrdG9wL015UGxvdHMvUzY0X0xvbmdTT0FfT3J0aEZhY2lsLnBkZiIsIHdpZHRoID0gMTIsIGhlaWdodCA9IDgpDQojUzY0X0xvbmdTT0FfT3J0aEZhY2lsIDwtIGdyaWQuYXJyYW5nZShTZW1SZWxRX1Bsb3QsT3J0aFJlbFFfUGxvdCwgbmNvbD0yLCBucm93PTEpDQojZGV2Lm9mZigpICMgQ2xvc2UgdGhlIGZpbGUNCg0KDQpgYGANCg0KDQo=